/**
 * @Author: 鱿鱼溪学院
 * @Date: 2025-11-08
 * @Description: 统一响应格式工具
 * @FilePath: \jmd-ser-ts\app\utils\response.ts
 */

import { Context } from "koa";

/**
 * 成功响应接口
 */
export interface SuccessResponse<T = any> {
  success: true;
  message: string;
  data?: T;
  timestamp: string;
}

/**
 * 失败响应接口
 */
export interface ErrorResponse {
  success: false;
  message: string;
  error?: string;
  timestamp: string;
}

/**
 * 分页响应接口
 */
export interface PaginatedResponse<T = any> {
  success: true;
  message: string;
  data: {
    list: T[];
    total: number;
    page: number;
    pageSize: number;
  };
  timestamp: string;
}

/**
 * 响应工具类
 */
export class ResponseUtil {
  /**
   * 成功响应
   * @param ctx Koa上下文对象
   * @param message 响应消息
   * @param data 响应数据
   * @param statusCode HTTP状态码
   */
  public static success<T = any>(
    ctx: Context,
    message: string = "操作成功",
    data?: T,
    statusCode: number = 200
  ): void {
    ctx.status = statusCode;
    ctx.body = {
      success: true,
      message,
      data,
      timestamp: new Date().toISOString()
    } as SuccessResponse<T>;
  }

  /**
   * 失败响应
   * @param ctx Koa上下文对象
   * @param message 错误消息
   * @param error 错误详情
   * @param statusCode HTTP状态码
   */
  public static error(
    ctx: Context,
    message: string = "操作失败",
    error?: string,
    statusCode: number = 500
  ): void {
    ctx.status = statusCode;
    ctx.body = {
      success: false,
      message,
      error,
      timestamp: new Date().toISOString()
    } as ErrorResponse;
  }

  /**
   * 分页响应
   * @param ctx Koa上下文对象
   * @param list 数据列表
   * @param total 总记录数
   * @param page 页码
   * @param pageSize 每页大小
   * @param message 响应消息
   */
  public static paginated<T = any>(
    ctx: Context,
    list: T[],
    total: number,
    page: number = 1,
    pageSize: number = 10,
    message: string = "获取列表成功"
  ): void {
    ctx.body = {
      success: true,
      message,
      data: {
        list,
        total,
        page,
        pageSize
      },
      timestamp: new Date().toISOString()
    } as PaginatedResponse<T>;
  }

  /**
   * 404响应
   * @param ctx Koa上下文对象
   * @param message 错误消息
   */
  public static notFound(ctx: Context, message: string = "资源不存在"): void {
    this.error(ctx, message, undefined, 404);
  }

  /**
   * 400响应
   * @param ctx Koa上下文对象
   * @param message 错误消息
   * @param error 错误详情
   */
  public static badRequest(ctx: Context, message: string = "请求参数错误", error?: string): void {
    this.error(ctx, message, error, 400);
  }

  /**
   * 401响应
   * @param ctx Koa上下文对象
   * @param message 错误消息
   */
  public static unauthorized(ctx: Context, message: string = "未授权访问"): void {
    this.error(ctx, message, undefined, 401);
  }

  /**
   * 403响应
   * @param ctx Koa上下文对象
   * @param message 错误消息
   */
  public static forbidden(ctx: Context, message: string = "禁止访问"): void {
    this.error(ctx, message, undefined, 403);
  }
}